Skip to main content

Custom Types dan Abilities

Selamat sudah mencapai setengah perjalanan kursus! Di pelajaran ini kita membahas abilities—“kemampuan” yang melekat pada tipe (khususnya struct) untuk menentukan apa yang boleh dilakukan terhadap nilainya.

Apa Itu Abilities?

Dalam Move, abilities adalah aturan/izin (permission) yang menentukan operasi apa yang boleh dilakukan pada sebuah nilai. Mirip hak: boleh disalin, boleh dibuang, boleh disimpan di storage global, atau boleh menjadi kunci objek global.

Sebagian instruksi bytecode mensyaratkan tipe punya ability tertentu sebelum dijalankan. Dengan begitu, penggunaan data lebih aman dan terkontrol.

Sintaks Abilities

Abilities ditambahkan setelah deklarasi struct dengan kata kunci has.

public struct StructName has {
...
}

Contoh:

public struct Color has key, store {
id: UID,
red: u8,
}

Empat Ability Utama

  1. copy : nilai bisa digandakan (di-copy)
  2. drop : nilai boleh dibuang (di-pop/destroy) tanpa harus dipakai
  3. store : nilai boleh disimpan di dalam struct yang berada di global storage
  4. key : struct bisa menjadi objek global (punya identitas / UID) untuk operasi storage

Kita bahas satu per satu.

Ability key

key memungkinkan tipe menjadi “global object” (memiliki identitas di storage). Jika sebuah struct punya key, semua field-nya harus punya (atau secara implisit memenuhi) syarat store. Contoh:

module examples::copy {

public struct ExampleObject has key { id: UID }

public entry fun new(ctx: &mut TxContext): ExampleObject {
let object = ExampleObject { id: object::new(ctx) };
object
}
}

Ability store

store memungkinkan nilai eksis di global storage. Praktiknya: bila struct jadi object on-chain, biasanya ditulis has key, store. Contoh:

module examples::copy {

public struct ExampleObject has key, store { id: UID }

public entry fun new(ctx: &mut TxContext): ExampleObject {
let object = ExampleObject { id: object::new(ctx) };
object
}
}

Di Sui Move, key wajib untuk object; store sangat umum tapi secara teknis bisa opsional tergantung kasus.

Ability copy

Memungkinkan nilai digandakan dengan operator copy. Contoh sederhana:

module examples::copy_demo {

public struct ExampleObject has key, copy { id: UID }

public entry fun new(ctx: &mut TxContext) {
let object = ExampleObject { id: object::new(ctx) };
let another = copy object; // menggandakan
another; // konsumsi (supaya tidak warning unused)
}
}

Ability drop

Memungkinkan nilai dibuang tanpa harus dipakai. Namun untuk object on-chain (memiliki UID), tidak bisa sekadar “hilang” begitu saja: biasanya perlu mekanisme destroy yang eksplisit agar aman. Jadi meski drop di-deklarasikan, penghapusan object dengan UID tetap dibatasi aturan Sui.

Penutup

Abilities penting untuk model keamanan Move. Kamu sudah sering melihat has key, store sebelumnya—sekarang kamu tahu alasannya. Selanjutnya kita akan mendalami object di Sui dan melihat lebih banyak contoh penerapan abilities.